/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.schedule;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

/**
 * Structure pour un cour. Un cour à un nom, une salle, un lieu, un groupe, un
 * professeur et un type associé Contient un ensemble de fonctions permettant de
 * créer, modifier, obtenir des informations sur un cours
 *
 * @author Zanette Sébastien,
 * @author Andrianjafintrimo Victor
 */
public class Lesson implements Comparable<Lesson>, Parcelable {

    private long lessonId;
    private String title;
    private String time;
    private String schedule;
    private int type;
    private int change;
    private String rooms;
    private String groups;
    private String teachers;
    private String color;
    private String note;
    private String created;
    private Date date;
    //Niveau de changement d'un emploi du temps
    public static final int NO_CHANGE = 0;
    public static final int LITTLE_CHANGE = 1;
    public static final int BIG_CHANGE = 2;

    public Lesson(long lessonId, String title, String time, String schedule, int type, int change, String room, String groups, String teacher, String color, String note, String created) {
        this.lessonId = lessonId;
        this.title = title;
        this.time = time;
        this.schedule = schedule;
        this.type = type;
        this.change = change;
        this.rooms = room;
        this.groups = groups;
        this.teachers = teacher;
        this.color = color;
        this.note = note;
        this.created = created;
        this.date = null;
    }

    /**
     * Permet de construire une {@code Lesson} à partir d'une serialisation
     *
     * @param in objet parcelable(=serialisable) contenant les informations du cours
     */
    public Lesson(Parcel in) {
        this(in.readLong(), in.readString(), in.readString(), in.readString(),
                in.readInt(), in.readInt(), in.readString(), in.readString(), in.readString(), in.readString(), in.readString(), in.readString());
    }

    /**
     * Constructeur vide de la classe {@code Lesson}
     */
    public Lesson() {
    }

    /**
     * Permet de changer les groupes d'une {@code Lesson}
     *
     * @param groups nouveau groupes du cours
     */
    public void setGroups(String groups) {
        this.groups = groups;
    }

    /**
     * Permet de changer l'id d'une {@code Lesson}
     *
     * @param lessonId nouvel id du cours
     */
    public void setLessonId(long lessonId) {
        this.lessonId = lessonId;
    }

    /**
     * Permet de changer la salle d'une {@code Lesson}
     *
     * @param room nouvelle salle du cours
     */
    public void setRoom(String room) {
        this.rooms = room;
    }

    /**
     * Permet de changer le nom de l'emploi du temps associé à une {@code Lesson}
     *
     * @param schedule nouvel emploi du temps
     */
    public void setSchedule(String schedule) {
        this.schedule = schedule;
    }

    /**
     * Permet de changer les professeurs d'une {@code Lesson}
     *
     * @param teacher nouveaux professeurs du cours
     */
    public void setTeachers(String teacher) {
        this.teachers = teacher;
    }

    /**
     * Permet de changer la date et l'heure d'une {@code Lesson}
     *
     * @param time nouvelles date et heure du cours
     */
    public void setTime(String time) {
        this.time = time;
        this.date = null;
    }

    /**
     * Permet de changer la date de création d'une {@code Lesson}
     *
     * @param created nouvelle date de création
     */
    public void setCreated(String created) {
        this.created = created;
    }

    /**
     * Permet de changer l'intitulé d'une {@code Lesson}
     *
     * @param title nouvelle intitulé du cours
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * Permet de changer le type d'une {@code Lesson}
     *
     * @param type nouveau type du cours
     */
    public void setType(int type) {
        this.type = type;
    }

    /**
     * Permet de changer l'importance d'un changement d'une {@code Lesson}
     *
     * @param change nouvelle importance de changement
     */
    public void setChange(int change) {
        this.change = change;
    }
       
    /**
     * Positionne la valeur du champ color à la valeur donnée en parmètre
     * @param color couleur d'affichage du cours
     */
    public void setColor(String color) {
        this.color = color;
    }
    
     /**
     * Positionne la valeur du champ note à la valeur donnée en parmètre
     * @param note du cours
     */
    public void setNote(String note) {
        this.note = note;
    }

    /**
     * Retourne la valeur du champ groups
     *
     * @return les groupes d'un cours
     */
    public String getGroups() {
        return groups;
    }

    /**
     * Retourne la valeur du champ lessonId
     *
     * @return l'id du cours
     */
    public long getLessonId() {
        return lessonId;
    }

    /**
     * Retourne la valeur du champ rooms
     *
     * @return la salle du cours
     */
    public String getRoom() {
        return rooms;
    }

    /**
     * Retourne la valeur du champ schedule
     *
     * @return l'emploi du temps du cours
     */
    public String getSchedule() {
        return schedule;
    }

    /**
     * Retourne la valeur du champ teacher
     *
     * @return les profresseurs liés au cours
     */
    public String getTeacher() {
        return teachers;
    }

    /**
     * Retourne la valeur du champ time
     *
     * @return l'heure du cours
     */
    public String getTime() {
        return time;
    }

    /**
     * Retourne la valeur du champ created
     *
     * @return la date de création du cours
     */
    public String getCreated() {
        return created;
    }

    /**
     * Retourne la valeur du champ title
     *
     * @return l'intitullé du cours
     */
    public String getTitle() {
        return title;
    }

    /**
     *
     *Retourne la valeur du champ type
     *@return le type du cours
     */
    public int getType() {
        return type;
    }

     /**
     * Retourne la valeur du champ change
     *
     * @return statut de changement d'un cours
     */
    public int getChange() {
        return change;
    }

     /**
     * Retourne la valeur du champ color
     *
     * @return la couleur d'affichage du cours
     */
    public String getColor() {
        return color;
    }

    /**
     * Retourne la valeur du champ note
     *
     * @return note du cours
     */
    public String getNote() {
        return note;
    }
    
    /**
     * Retourne une chaîne de caractère avec les informations sur un cours
     *
     * @return String contenant les informtion d'une {@code Lesson}
     */
    @Override
    public String toString() {
        return String.format("ID : %s\nCours : '%s'\nNom de l'EDT associé : '%S'\nType :"
                + " %s\nSalle(s) : '%s'\nGoupes : '%s'\nEnseignant(s) : '%s'\nHeure : '%s'\nCouleur : '%s'\nNote : '%s'",
                lessonId, title, schedule, type, rooms, groups, teachers, time, color, note);
    }

    /**
     * Permet de comparer la date de deux cours
     *
     * @param another {@code Lesson à comparer avec 'linstance actuelle
     * @return un nombre positif l'instance actuelle a une date supérieur, 0 si
     * les deux dates sont égales, un nombre négatif sinon
     */
    public int compareTo(Lesson another) {
        Date start = this.getDate();
        Date end = another.getDate();
        //return this.time - another.time ;
        return start.compareTo(end);
    }// compareTo(Lesson)

    /**
     * Permet de construire la date d'un cours au bon format (JJ/MM/AAAA)
     */
    protected void buildDate() {
        // Time representation example : 20/01/2012 10h00 - 12h00
        StringBuilder s = new StringBuilder(this.time);
        // Extract the beginning : 20/01/2012 10h00
        int pos = s.indexOf("-");
        while ((pos > 0) && ((s.charAt(pos) < '0') || ('9' < s.charAt(pos)))) {
            pos--;
        }// while
        s = new StringBuilder(s.substring(0, pos + 1));
        try {
            this.date = new SimpleDateFormat("yyyy/MM/dd HH:mm").parse(s.toString());
            Log.i("buildate", "BuildDate : " + date);
        } catch (ParseException e) {/*
             *
             */

        }// try
    }

    /**
     * Retourne la date d'un cours si le champ date n'est pas null, sinon on
     * fait appel à buildDate()
     *
     * @return la date d'un cours
     */
    public Date getDate() {
        if (this.date == null) {
            this.buildDate();
        }// if
        return this.date;
    }// getDate()

    /**
     * {@inheritedDoc}
     */
    public int describeContents() {
        return 0;
    }

    /**
     * Ecrit les informarions d'une {@code Lesson} dans une structure de données
     *
     * @param parcel
     * @param flags permet d'ajouter éventuellement des options
     */
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeLong(lessonId);
        parcel.writeString(title);
        parcel.writeString(time);
        parcel.writeString(schedule);
        parcel.writeInt(type);
        parcel.writeInt(change);
        parcel.writeString(rooms);
        parcel.writeString(groups);
        parcel.writeString(teachers);
        parcel.writeString(color);
        parcel.writeString(note);
        parcel.writeString(created);
    }
    /**
     * Créé une structure de données {@code Lesson}
     */
    public static final Parcelable.Creator<Lesson> CREATOR = new Parcelable.Creator<Lesson>() {

        public Lesson createFromParcel(Parcel in) {
            return new Lesson(in);
        }

        public Lesson[] newArray(int pos) {
            return new Lesson[pos];
        }
    };

    /**
     * Compare deux cours champ par champ
     *
     * @param o {@code Lesson} à comparer avec l'instance actuelle
     * @return true si les deux cours sont identique, false sinon
     */
    @Override
    public boolean equals(Object o) {
        if (o instanceof Lesson) {
            Lesson other = (Lesson) o;
            return this.time.equals(other.time)
                    && this.groups.equals(other.groups)
                    && this.rooms.equals(other.rooms)
                    && this.teachers.equals(other.teachers)
                    && this.title.equals(other.title);
        }// if
        return super.equals(o);
    }// equals(Object)

    /**
     * Compare le niveau de changement d'un cours. Pas de changement (0) Gros
     * changement (2): heure ou la salle d'un cours Petit changement (3): autres
     *
     * @param o cours
     * @return le statut du changement (0,1,2)
     */
    public int getLevelChange(Object o) {
        if (o instanceof Lesson) {
            Lesson other = (Lesson) o;
            if (this.rooms.equals(other.rooms) || this.time.equals(other.time)) {
                return Lesson.BIG_CHANGE;
            } else if (this.teachers.equals(other.teachers) || this.groups.equals(other.groups)) {
                return Lesson.LITTLE_CHANGE;
            }
            return Lesson.NO_CHANGE;

        }// if
        return Lesson.NO_CHANGE;
    }// equals(Object)
}// class Lesson
